<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vR3QYysQvaeXyVD4ObCjqbhGq-yFnBXfBQAiWQrTImKOF2pnGuwLumqYMvmrPaWPHnGP9ENjwlcVNNT/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - November 19 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - November 19 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_ljh3z33ucdyz-7>li:before{content:"\0025cb  "}ul.lst-kix_ljh3z33ucdyz-8{list-style-type:none}ul.lst-kix_ljh3z33ucdyz-7{list-style-type:none}ul.lst-kix_ljh3z33ucdyz-4{list-style-type:none}ul.lst-kix_ljh3z33ucdyz-3{list-style-type:none}.lst-kix_ljh3z33ucdyz-6>li:before{content:"\0025cf  "}ul.lst-kix_ljh3z33ucdyz-6{list-style-type:none}ul.lst-kix_ljh3z33ucdyz-5{list-style-type:none}ul.lst-kix_ljh3z33ucdyz-0{list-style-type:none}.lst-kix_ljh3z33ucdyz-3>li:before{content:"\0025cf  "}ul.lst-kix_ljh3z33ucdyz-2{list-style-type:none}ul.lst-kix_ljh3z33ucdyz-1{list-style-type:none}.lst-kix_ljh3z33ucdyz-5>li:before{content:"\0025a0  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_ljh3z33ucdyz-4>li:before{content:"\0025cb  "}.lst-kix_ljh3z33ucdyz-2>li:before{content:"\0025a0  "}.lst-kix_ljh3z33ucdyz-1>li:before{content:"\0025cb  "}.lst-kix_ljh3z33ucdyz-0>li:before{content:"\0025cf  "}.lst-kix_ljh3z33ucdyz-8>li:before{content:"\0025a0  "}ol{margin:0;padding:0}table td,table th{padding:0}.c2{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c1{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c10{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c3{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c7{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c4{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c5{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c6{padding:0;margin:0}.c9{color:inherit;text-decoration:inherit}.c8{height:11pt}.c11{margin-left:72pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c5"><h2 class="c3" id="h.2lopfh9yvmr4"><span class="c10">Participants</span></h2><p class="c7"><span class="c0">Yoav Weiss, Dave Pifke, Nic Jansma, Noam Helfman, Noam Rosenthal, Sean Feng, Benjamin De Kosnik, Michal Mocny, Michelle Vu, Thomas Kelly, Steven Bougon, Nicolás Peña Moreno, Peter Perlepes</span></p><p class="c7 c8"><span class="c0"></span></p><h2 class="c3" id="h.9ssx0oloiwo0"><span class="c10">Next Call</span></h2><p class="c7"><span class="c0">December 3rd at 10am PST / 1pm PST</span></p><h2 class="c3" id="h.pyp51rk1lojs"><span class="c10">Agenda</span></h2><p class="c7"><span class="c0"><b>Case study</b>: Wikipedia preview popup extension - Noam Rosenthal</span></p><ul class="c6 lst-kix_ljh3z33ucdyz-0 start"><li class="c1 li-bullet-0"><span><b>Presentation</b>: </span><span class="c4"><a class="c9" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1JNlmf8gwA3GgzpIK3RVjMo0WitbFzp2GPQYEJEPPIwI/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1613232384231000&amp;usg=AOvVaw2jRicraMmg-gFjtc4oozQ4">Optimizing MediaWiki Preview Popups</a></span></li><li class="c1 li-bullet-0"><span>(</span><span class="c4"><a class="c9" href="https://www.google.com/url?q=https://www.mediawiki.org/wiki/Extension:Popups&amp;sa=D&amp;source=editors&amp;ust=1613232384232000&amp;usg=AOvVaw1p41k7-b6gRH1MK6QyYa0P">https://www.mediawiki.org/wiki/Extension:Popups</a></span><span class="c0">)</span></li><li class="c1 li-bullet-0"><span class="c0">Performance challenges of developing real-world popups, and how/which improvements in the web platform could help</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: Freelance web developer, in this case working with Wikipedia</span></li><li class="c1 li-bullet-0"><span class="c0">... Idea was to look at existing popular web feature (Wikipedia preview popups), see what’s missing in web platform to make this easier in the future</span></li><li class="c1 li-bullet-0"><span class="c0">… Everytime there’s new concepts like popovers, there are performance problems and solutions that are non-standard</span></li><li class="c1 li-bullet-0"><span class="c0">… Research into what the web platform could provide</span></li><li class="c1 li-bullet-0"><span class="c0">… When you hover or focus on a link, you see a balloon with content from the next page, snippet of text and thumbnail</span></li><li class="c1 li-bullet-0"><span class="c0">… UI requirements such as clipping the image, cursor appears to mouse, place based on viewport, and stacks on top of the navigation elements</span></li><li class="c1 li-bullet-0"><span class="c0">… Stacking vs. Placement dilemma: Does it go in tree or out of tree</span></li><li class="c1 li-bullet-0"><span class="c0">… Out of the tree requires measurement</span></li><li class="c1 li-bullet-0"><span class="c0">… Layout thrashing is difficult to make go away if there’s any measurement</span></li><li class="c1 li-bullet-0"><span class="c0">… Due to JavaScript execution delays, by the time you get client rects, you could be off</span></li><li class="c1 li-bullet-0"><span class="c0">… Contributes to layout thrashing and jank</span></li><li class="c1 li-bullet-0"><span>… Top layer research (</span><span class="c4"><a class="c9" href="https://www.google.com/url?q=https://github.com/whatwg/html/issues/4633&amp;sa=D&amp;source=editors&amp;ust=1613232384233000&amp;usg=AOvVaw0djqjkAnO291Mcc4-izCOB">https://github.com/whatwg/html/issues/4633</a></span><span class="c0">) separates ???</span></li><li class="c1 li-bullet-0"><span class="c0">… popper.js find a way to position a popup relative to another element, can cause layout thrash, part of Bootstrap (3% web usage)</span></li><li class="c1 li-bullet-0"><span class="c0">… “relative-to” proposal as well</span></li><li class="c1 li-bullet-0"><span class="c0">… Tried to use MouseEvent.offsetX to find position of cursor, they have bugs, FF is different from Chromium and Safari</span></li><li class="c1 li-bullet-0"><span class="c0">… TIL: Only way to totally remove thrashing is to totally remove synchronous measurements</span></li><li class="c1 li-bullet-0"><span class="c0">… Batching them together reduces them but does not remove them</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Would an async measurement API have helped here? Or would the response return too late?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: It would help but not be optimal. If you had something like ResizeObserver but for position, it would be one solution, if it worked on coordinates but not sizes</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: And IntersectionObserver does not help here</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: IO does not tell where an element is</span></li><li class="c1 li-bullet-0"><span class="c0">… Might want to have a PositionObserver as an intermediate solution ,but I was trying to solve popups at a high level.</span></li><li class="c1 li-bullet-0"><span class="c0">… Clipping: SVG used by Wikipedia, requires a lot of code</span></li><li class="c1 li-bullet-0"><span class="c0">… Tried to replace with modern clip-path, but polygons don’t have rounded corners, and paths only have absolute coordinates, so you can’t make a responsive balloon</span></li><li class="c1 li-bullet-0"><span class="c0">… I was able to mimic the behavior with polygon here since it only needed a 2px radius, so I just switched to a straight line</span></li><li class="c1 li-bullet-0"><span class="c0">… Working with CSS WG on a new shape</span></li><li class="c1 li-bullet-0"><span class="c0">… Overriding default behavior, i.e. Title attribute has a default behavior for a tooltip</span></li><li class="c1 li-bullet-0"><span class="c0">… On wikipedia, JS removes the title attribute and reinstated it when the popup is hidden</span></li><li class="c1 li-bullet-0"><span class="c0">… Code appears in profiler, new style calculation in case something relies on the title attribute for styling</span></li><li class="c1 li-bullet-0"><span class="c0">… Looked at web usage, Bootstrap tooltips do this, on hover it removes the title attribute</span></li><li class="c1 li-bullet-0"><span class="c0">… What I would expect to happen is preventDefault could be used</span></li><li class="c1 li-bullet-0"><span class="c0">… preventDefault behavior is not standard and does nothing on mouseover</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Is any browser doing what you think is the right thing in preventDefault on mouseover?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: No</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Could be an implementation bug on all three</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: Websites are built with the preventDefault behavior in mind, like in the example link to bootstrap-tooltip</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam Helfman</b>: From what I remember, tooltips are implemented using title or JavaScript, are not considered accessible</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam R</b>: Preview popups are accessible, you can reach them with focus but they’re aria-hidden</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Thomas</b>: They’re pulling from content that the link is referencing -- it’s a navigation away</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: Titles in general are sometimes discouraged. For Wikipedia, when Popup Preview is not available the tooltip (via title) works</span></li><li class="c1 li-bullet-0"><span class="c0">… Looked for suboptimal but viable solutions</span></li><li class="c1 li-bullet-0"><span class="c0">… First thing was to do all sync measurements at the event handler, reduces some thrashing but not 100%</span></li><li class="c1 li-bullet-0"><span class="c0">… Still needs to use getClientRects() which does too many things, needs to calculate transforms, etc. &nbsp;All I care about is the hit rect from my mouse event, but I still have to call getClientRects()</span></li><li class="c1 li-bullet-0"><span class="c0">… Next, I’m using a polygon with semi-rounded corners, OK for this UI but if a designer wanted different rounding that wouldn’t be available</span></li><li class="c1 li-bullet-0"><span class="c0">… Finally I’m removing all title attributes which works for MediaWiki, but might not be OK for libraries like bootstrap</span></li><li class="c1 li-bullet-0"><span class="c0">… Feature requests: Solution for popovers (stacking vs. placement)</span></li><li class="c1 li-bullet-0"><span class="c0">… Fix MouseEvent.offset[X|Y]</span></li><li class="c1 li-bullet-0"><span class="c0">… Flexible shape clip-path</span></li><li class="c1 li-bullet-0"><span class="c0">… preventDefault for mouseover should disable native tooltip</span></li><li class="c1 li-bullet-0"><span class="c0">… Main takeaway for this group is not just about monitoring, but sometimes performance is about fixing bugs and allowing forms of expression</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: One more question about offsetXY issues, currently we have different behavior in Firefox vs. Chrome/Safari, do we have breakage in Firefox about that different behavior?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: There are bugs reported, and many people just recommend to not use it. &nbsp;StackOverflow answers often suggest getBoundingClientRect() -- which is a frequent answer, they don’t have a solution so they recommend it, causing performance problems</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam Helfman</b>: Would using MutationObserver(?) work here</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam R</b>: You still need to measure it somehow, you need ResizeObserver. &nbsp;Just doing one sync measurement would help.</span></li><li class="c1 li-bullet-0"><span class="c0">… Mutations don’t consider scrolling, images loading, fonts loading</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam H</b>: Correlated with IntersectionObserver and events, it becomes a heuristic</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Gilles</b>: My main comment for this particular is how difficult it is to do the good thing and how easy it is to do the bad thing. &nbsp;We frequently have performance reviews and say “please don’t use that API”, but in some cases this is the only thing available to use</span></li><li class="c1 li-bullet-0"><span class="c0">… Very advanced CSS and JS knowledge required to do this properly</span></li><li class="c1 li-bullet-0"><span class="c0">… Maybe we should warn people more about expensive JS functions that are used frequently</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: What I can imagine us (as web platform) is assuming we fix those things, people won’t necessarily adopt the fix, but PR those fixes to the libraries to help make them more performant</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: I think library developers want to do the right thing, e.g. jquery using offsetX, there was already a fix. &nbsp;I think people want to do the right thing.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Most of the issues you mentioned are not things this working group can solve, beyond that what other low-hanging fruit is out there?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: I think going back to the performance WG, besides being advocates, having wider knowledge and conversations with other groups, I would say measuring and alerting about layout thrashing and sync measurement would help. &nbsp;Maybe even a performance entry for that.</span></li><li class="c1 li-bullet-0"><span class="c0">… Any time there was a style calculation/layout that didn’t come from painting, this should be a yellow flag.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Flagged in dev tools in some modes, but not in the wild. &nbsp;And this kind of measurement is highly dependent on user interaction, and may not be seen in the lab</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: One thing I found if you have a perf review of a website about jankiness, look for usage of getBoundingClientRect, smoking gun</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Part I’m having trouble with is if there’s another different async API that could be a replacement, or there will still be cases where get getBoundingClientRect() would still be needed</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: It’s an API that might get called a lot. Trying to synchronize position with JS, would still be hard. The real solution is to figure out a way to add popups that get stacked with the whole page. Several solutions to that that would let the browser lay out that element. Any other solution would require JS on scroll.</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Benjamin</b>: Was curious about what Gilles said is JS libraries doing the wrong things, are there examples?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Noam</b>: My examples about popper and bootstrap-tooltip, they’re doing the wrong thing but that’s just because there’s not another solution</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Yoav</b>: Right order would be creating a reasonable alternative, then ask/PR them to move to it. &nbsp;</span></li></ul><h2 class="c3" id="h.ysufb1964sx0"><span class="c10">Issue Triage</span></h2><p class="c7 c8"><span class="c0"></span></p><ul class="c6 lst-kix_ljh3z33ucdyz-0"><li class="c1 li-bullet-0"><span class="c4"><a class="c9" href="https://www.google.com/url?q=https://github.com/w3c/navigation-timing/issues/124&amp;sa=D&amp;source=editors&amp;ust=1613232384240000&amp;usg=AOvVaw0Cykzb_8cqP10Ng43Smyfl">What should transferSize, encodedBodySize and decodedBodySize in Navigation + Resource Timing represent for responses where a Service Worker is involved? · Issue #124 · w3c/navigation-timing</a></span><span class="c0">&nbsp;</span></li></ul><ul class="c6 lst-kix_ljh3z33ucdyz-1 start"><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Currently, they’re all returning 0, probably not what we want them to</span></li><li class="c2 li-bullet-0"><span class="c0">… Discussion one what we should be returning</span></li><li class="c2 li-bullet-0"><span class="c0">… Issue coalesced on returning values as close as possible to the transferred sizes</span></li><li class="c2 li-bullet-0"><span class="c0">… responseBody in Fetch has equivalence to encoded and decoded body sizes</span></li><li class="c2 li-bullet-0"><span class="c0">… Does not have equivalence to transferSize</span></li><li class="c2 li-bullet-0"><span class="c0">… Then when a SW is putting together various response objects, we could take those values and report them</span></li><li class="c2 li-bullet-0"><span class="c0">… Question to the group, does this make sense?</span></li><li class="c2 li-bullet-0"><span class="c0">… From my perspective the proposal makes general sense, the thing that scares me are the Fetch integration pieces</span></li><li class="c2 li-bullet-0"><span class="c0">… We’ll need ResourceTiming to operate on a response object in order to make use of those parameters</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicolás</b>: Do we know what other browsers do?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Safari doesn’t implement sizes, Firefox returns 0</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicolás</b>: We want to fix this in the spec first</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Fixing it may require full Fetch integration</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: Could we align with Fetch spec’s concepts without fully aligning the whole spec with Fetch?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Maybe there’s a path forward with integrating the Response object in the processing model and reporting those values</span></li></ul><p class="c7 c8 c11"><span class="c0"></span></p><ul class="c6 lst-kix_ljh3z33ucdyz-0"><li class="c1 li-bullet-0"><span class="c4"><a class="c9" href="https://www.google.com/url?q=https://github.com/w3c/perf-timing-primer/issues/21&amp;sa=D&amp;source=editors&amp;ust=1613232384242000&amp;usg=AOvVaw1_D1U7h2tchsFneSSeJk6V">https://github.com/w3c/perf-timing-primer/issues/21</a></span><span class="c0">&nbsp;</span></li></ul><ul class="c6 lst-kix_ljh3z33ucdyz-1 start"><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Sam Weiler pointed out that the document claims to be normative, but it’s just documentation. Xiaoxian recommended to obsolete the document. Haven’t looked lately.</span></li><li class="c2 li-bullet-0"><span class="c0">… Might be worthwhile for someone to go over it and determine that. Anyone feels like they want to take on that task?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: Do we want to maintain that document?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: If it’s indeed out-of-date, we should probably obsolete it. Maybe the right place for it is in MDN or another developer-facing venue</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nicolás</b>: Has anyone used this document?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: Analytics?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Has anyone looked at this document?</span></li><li class="c2 li-bullet-0"><span class="c0">&lt;crickets&gt;</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Might be the right call to obsolete it.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: From GH traffic analytics - 3 unique visitors, the people that filed the issue</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: Can ask around Chrome folks to see if they think it’s useful and want to maintain it.</span></li><li class="c2 li-bullet-0"><span class="c0">… Benjamin, I believe the original motivation for this was from Mozilla. Can you ask around on the Mozilla side?</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Benjamin</b>: Will do. You have my support to deprecate this.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Nic</b>: Marcos proposed moving it to MDN in 2018.</span></li><li class="c2 li-bullet-0"><span class="c0"><b>Yoav</b>: We can settle on obsoleting this unless something says it’s required</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjoxKwrB9b9Pmi7A6p5v2LXjQB2EGentuEP5_f5svSL6dCDPmQGezSHfFkAIjDeE20ottFPAvc-pSdgBpxj4:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>